﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 但是不得不说的是，适配器模式是一种没有办法的办法。
/// 如果可能的话，尽量在程序设计之初就考虑到这样的问题，
/// 编写出一种更合理的继承关系（例如Plant和Animal都继承自Creature类，Creature里包含血量和攻击力等属性，而Plant里面这两个值都为0）。
/// 或者在程序完成度还不高的时候，及时重构。只有在不得已的情况下（例如程序编写已经进入后期，重构代价会很大）才会考虑适配器模式。


 //   适配器（Adapter）又名包装器（Wrapper），将一个类的接口转换成用户希望的另外一个接口，使得原本接口不兼容的类可以一起工作。

//适配器又分为类适配器和对象适配器，而类适配器的实现需要多重继承，而C#并不支持多重继承，所以本文只讨论对象适配器。
/// </summary>


public class Plant
{
    public virtual void BeCollected()
    {
        Debug.Log("Drop seeds");
    }
}

public class PrianhaAdapter:Animal
{
    private Plant _plant = new Plant();
    protected override void AnimalDead()
    {
        _plant.BeCollected();
    }
}

public class Animal
{
    public int hp { get; private set; }
    public int atk { get; private set; }
    public Animal()
    {
        hp = 100;
        atk = 20;
    }
    public void BeAttacked(Animal attacker)
    {
        if (hp > 0)
        {
            hp -= attacker.atk;
        }
        if (hp <= 0)
        {
            AnimalDead();
        }
    }
    protected virtual void AnimalDead()
    {
        Debug.Log("Drop meat");
    }
}

public class A
{
    public A()
    {
        Debug.Log("A");
    }
}

public class Adapter : MonoBehaviour
{

    void Start()
    {
        Plant plant = new Plant();
        plant.BeCollected();
        Animal animal = new Animal();
        Animal attacker = new Animal();
        PrianhaAdapter prianha = new PrianhaAdapter();
        Debug.Log(prianha.hp);
        Debug.Log(prianha.atk);
        while (prianha.hp>0)
        {
            // animal.BeAttacked(attacker);
            prianha.BeAttacked(attacker);
        }
        

    }


}
